RAIS  3.2
C:/Projekte/RAIS/ApplicationLogiLayer/ReportManagement.cs
Go to the documentation of this file.
00001 
00028 using System;
00029 using System.Collections.Generic;
00030 using System.Data;
00031 using System.Data.SqlClient;
00032 using System.IO;
00033 using System.Text;
00034 using System.Xml;
00035 using Microsoft.Reporting.WebForms;
00036 using System.Configuration;
00037 using System.Globalization;
00038 
00039 using RAIS.Common.DynamicMaskManagement;
00040 using RAIS.Common.UserManagement;
00041 using RAIS.DataAccessLayer;
00042 using RAIS.Common;
00043 using RAIS.Common.RADEVClasses;
00044 
00045 namespace RAIS.ApplicationLogicLayer
00046 {
00047         public static class ReportManagement
00048         {
00049                 enum ReportPart
00050                 { 
00051                         Header,
00052                         Details,
00053                         Footer,
00054                         GroupHeader,
00055                         GroupFooter
00056                 }
00057                 //*********************************************************************
00058                 #region Fields
00059                 const string dataSourceName = "ReportDataSource";
00060                 const string dataSetName = "Report_Table";
00061                 const string rdlcFileName = "Reports/Template - RAIS standard.rdlc"; // - Test.rdlc"; //
00062                 const string logoImageFileName = "Images/iaea.jpg";
00063                 const string rdlcNamespaceURI = "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition";
00064                 const string rdNamespaceURI = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner";
00065                 const string cellXml =
00066                           "<TableCell xmlns=\"http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition\" xmlns:rd=\"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner\">"
00067                         + "     <ReportItems>"
00068                         + "             <Textbox Name=\"\">"
00069                         + "                     <rd:DefaultName></rd:DefaultName>"
00070                         + "                     <Style>"
00071                         + "                             <PaddingLeft>2pt</PaddingLeft>"
00072                         + "                             <PaddingRight>2pt</PaddingRight>"
00073                         + "                             <PaddingTop>2pt</PaddingTop>"
00074                         + "                             <PaddingBottom>2pt</PaddingBottom>"
00075                         + "                     </Style>"
00076                         + "                     <ZIndex>0</ZIndex>"
00077                         + "                     <CanGrow>true</CanGrow>"
00078                         + "                     <Value />"
00079                         + "             </Textbox>"
00080                         + "     </ReportItems>"
00081                         + "</TableCell>";
00082 
00083                 const string sizeUnitDecmalSeparator = ".";
00084                 const string sizeUnit = "cm";
00085                 const string fontSizeUnit = "pt";
00086                 const string bodyFontSize = "9pt";
00087                 const string bodyFontFamily = "Arial";
00088                 const string groupsFontFamily = "Times New Roman";
00089 
00090                 const double sheetLongSideLength = 29.7;
00091                 const double sheetShortSideLength = 21;
00092                 const double interactiveHeight = 4;
00093                 const double leftMargin = 1;
00094                 const double rightMargin = 1;
00095                 const double tableTop = 0;
00096                 const double tableHeight = 4.44444;
00097                 const double rowHeight = 0.63492;
00098                 const double firstColumnWidth = 0.5;
00099                 const int groupFontSize = 11;
00100 
00101                 static string rdlcFullName;
00102                 static XmlNamespaceManager namespaceManager;
00103                 static DataSet dataSet;
00104                 static XmlElement root;
00105                 static Dictionary<int, string> groupColumns;
00106                 static Dictionary<int, double> columnsWidths;
00107                 static double pageHeight;
00108                 static double pageWidth;
00109                 static double reportWidth;
00110                 static string reportName;
00111                 static UserData currentUser;
00112                 static string grouping;
00113                 static string widths;
00114         static string dateRange=null;
00115                 static string logoImageUrl;
00116                 static string additionalFooterText;
00117         static bool _isRTL;
00118                 #endregion Fields
00119                 //*********************************************************************
00120                 #region Properties              
00121 
00122 
00123 
00124         public static string DataSetName
00125                 {
00126                         get { return dataSetName; }
00127                 }
00128                 #endregion Properties
00129                 //*********************************************************************
00130                 #region Public methods
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138 
00139         static public MemoryStream CreateReportDefinition(DynamicMaskData dynamicMaskData
00140                         , string sitePath, string siteURL, string orientation, string cultureName, bool isRTL)
00141                 {
00142             _isRTL = isRTL;
00143                         MemoryStream reportDefinitionStream = new MemoryStream();
00144 
00145                         logoImageUrl = siteURL + logoImageFileName;
00146             SetDateRange(dynamicMaskData);
00147                         dataSet = dynamicMaskData.DataSet;
00148                         currentUser = dynamicMaskData.CurrentUser;
00149                         reportName = dynamicMaskData.DynamicMask.Name;
00150                         grouping = dynamicMaskData.DynamicMask.Grouping;
00151                         widths = dynamicMaskData.DynamicMask.Widths;
00152                         additionalFooterText = dynamicMaskData.DynamicMask.Footer;
00153 
00154 
00155             // Remove _ID fields from dataset
00156             foreach (DataTable table in dataSet.Tables)
00157             {
00158                 for (int i = 0; i < table.Columns.Count; i++)
00159                 {
00160                     if ((table.Columns[i].ColumnName.Contains("PK ") && table.Columns[i].ColumnName.Contains(" ID")) ||
00161                         (table.Columns[i].ColumnName.Contains("FK ") && table.Columns[i].ColumnName.Contains(" ID")))
00162                     {
00163                         table.Columns.Remove(table.Columns[i]);
00164                         i--;
00165                     }
00166                 }
00167             } // End Remove _ID fields from dataset
00168 
00169             
00170 
00171                         if (orientation == "Portrait")
00172                         {
00173                                 pageHeight = sheetLongSideLength;
00174                                 pageWidth = sheetShortSideLength;
00175                         }
00176                         else
00177                         {
00178                                 pageHeight = sheetShortSideLength;
00179                                 pageWidth = sheetLongSideLength;
00180                         }
00181                         reportWidth = pageWidth - leftMargin - rightMargin;
00182 
00183                         // Parse groping string into grouping columns Dictionary
00184                         ParseGrouppingString();
00185 
00186                         // Parse widths string into columnsWidths Dictionary
00187                         ParseWidthsString();
00188 
00189                         // Load xml report definition
00190                         XmlDocument xmlReportDefinition = new XmlDocument();
00191                         rdlcFullName = string.Format("{0}/{1}", sitePath, rdlcFileName);
00192                         xmlReportDefinition.Load(rdlcFullName);
00193                         root = xmlReportDefinition.DocumentElement;
00194 
00195                         // Create namespace manager
00196                         namespaceManager = new XmlNamespaceManager(xmlReportDefinition.NameTable);
00197                         namespaceManager.AddNamespace("rdlc", rdlcNamespaceURI);
00198                         namespaceManager.AddNamespace("rd", rdNamespaceURI);
00199 
00200                         //-- Xml processing
00201                         // Set language
00202                         string languageNodePath = "//rdlc:Language";
00203                         XmlNode languageNode = root.SelectSingleNode(languageNodePath, namespaceManager);
00204                         if (languageNode != null)
00205                 languageNode.InnerText = cultureName;//System.Globalization.CultureInfo.CurrentCulture.Name;
00206             
00207                         // Page settings
00208                         SetPageSettings();
00209 
00210                         // Set Page header settings
00211                         SetPageHeaderSettings();
00212 
00213                         // Create DataSources
00214                         AddDataSourcesNode();
00215 
00216                         // Create DataSets
00217                         AdddataSetsNode();
00218 
00219                         // Change Body definition
00220                         XmlElement tableElement = CreateBodyDefinition();
00221 
00222                         // Add Table groups
00223                         if (groupColumns.Count != 0)
00224                                 AddTableGroups(tableElement);
00225 
00226                         // Create Header Cells
00227                         AddReportPart(tableElement, ReportPart.Header, 0, 0);
00228 
00229                         // Create Details Cells
00230                         AddReportPart(tableElement, ReportPart.Details, 0, 0);
00231 
00232                         // Create Footer Cells
00233                         AddReportPart(tableElement, ReportPart.Footer, 0, 0);
00234 
00235                         // Page Footer elements
00236                         SetPageFooterControlsSettings();
00237 
00238                         // Save to stream
00239                         xmlReportDefinition.Save(reportDefinitionStream);
00240                         reportDefinitionStream.Position = 0;
00241 
00242                         return reportDefinitionStream;
00243                 }
00251         static public Microsoft.Reporting.WebForms.ReportDataSource GetRADEVDataSource(string provaderName, string reportName, RADEVCriterias criterias)
00252         {
00253             Common.RADEVClasses.RADEVTable tab = Common.RADEVClasses.RADEVTable.CreateTable(provaderName, reportName);
00254             return new Microsoft.Reporting.WebForms.ReportDataSource(tab.GetSourceName(), tab.GetDataList(criterias));
00255         }
00262         static public List<RADEVTable> GetRADEVLineList(string provaderName,RADEVCriterias criterias)
00263         {
00264             Common.RADEVClasses.RADEVTable tab = Common.RADEVClasses.RADEVTable.CreateTable(provaderName, "EventMaster");
00265             return (List<RADEVTable>)tab.GetDataList(criterias);
00266         }
00274         static public MemoryStream GetTranslatedReportDefinition(UserData user, string rdlcFileName, string siteUrl, string cultureName, bool isRTL)
00275                 {
00276             _isRTL = isRTL;
00277                         currentUser = user;
00278                         MemoryStream reportDefinitionStream = new MemoryStream();
00279 
00280                         // Load xml report definition
00281                         XmlDocument xmlReportDefinition = new XmlDocument();
00282                         xmlReportDefinition.Load(rdlcFileName);
00283                         root = xmlReportDefinition.DocumentElement;
00284 
00285                         // Create namespace manager
00286                         namespaceManager = new XmlNamespaceManager(xmlReportDefinition.NameTable);
00287                         namespaceManager.AddNamespace("rdlc", rdlcNamespaceURI);
00288                         namespaceManager.AddNamespace("rd", rdNamespaceURI);
00289 
00290             string headerImageValueNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Image/rdlc:Value";
00291             XmlNode headerImageValueNode = root.SelectSingleNode(headerImageValueNodePath, namespaceManager);
00292             if (headerImageValueNode != null)
00293             {
00294                 headerImageValueNode.InnerText = string.Format("=\"{0}\"", siteUrl + "Images/RADEV_header_logo_new.jpg");
00295             }
00296 
00297             headerImageValueNodePath = "//rdlc:PageFooter/rdlc:ReportItems/rdlc:Image/rdlc:Value";
00298             headerImageValueNode = root.SelectSingleNode(headerImageValueNodePath, namespaceManager);
00299             if (headerImageValueNode != null)
00300             {
00301                 headerImageValueNode.InnerText = string.Format("=\"{0}\"", siteUrl+"/Images/RADEV_footer_logo_new.jpg");
00302             }
00303 
00304                         //-- Xml processing
00305                         // Set language
00306                         string languageNodePath = "//rdlc:Language";
00307                         XmlNode languageNode = root.SelectSingleNode(languageNodePath, namespaceManager);
00308                         if (languageNode != null)
00309                 languageNode.InnerText = cultureName;
00310 
00311                         XmlNode nodeForTranslation;
00312                         nodeForTranslation = root.SelectSingleNode("//rdlc:PageHeader", namespaceManager);
00313                         if (nodeForTranslation != null)
00314                                 TranslateTextBoxes(nodeForTranslation);
00315 
00316                         nodeForTranslation = root.SelectSingleNode("//rdlc:Body", namespaceManager);
00317                         if (nodeForTranslation != null)
00318                                 TranslateTextBoxes(nodeForTranslation);
00319 
00320                         nodeForTranslation = root.SelectSingleNode("//rdlc:PageFooter", namespaceManager);
00321                         if (nodeForTranslation != null)
00322                                 TranslateTextBoxes(nodeForTranslation);
00323 
00324             AddDirrectionNode(root.SelectSingleNode("//rdlc:Body/rdlc:ReportItems/rdlc:List", namespaceManager));
00325 
00326             if(_isRTL)
00327                 ReversTextBoxs(xmlReportDefinition, namespaceManager);
00328 
00329                         // Save to stream
00330                         xmlReportDefinition.Save(reportDefinitionStream);
00331                         reportDefinitionStream.Position = 0;
00332 
00333                         return reportDefinitionStream;
00334                 }
00335                 #endregion Public methods
00336                 //*********************************************************************
00337                 #region Private methods
00338 
00339                 static void ParseGrouppingString()
00340                 {
00341                         if (groupColumns == null)
00342                                 groupColumns = new Dictionary<int, string>();
00343                         else
00344                                 groupColumns.Clear();
00345 
00346                         string[] groups = grouping.Split(new char[] { ';' });
00347                         foreach (string groupIndex in groups)
00348                         {
00349                                 int colNumber;
00350                                 bool success = int.TryParse(groupIndex, out colNumber);
00351                                 if (success && colNumber >= 0 && colNumber < dataSet.Tables[0].Columns.Count)
00352                                         groupColumns.Add(colNumber, dataSet.Tables[0].Columns[colNumber].ColumnName);
00353                         }
00354                 }
00355 
00356                 static void ParseWidthsString()
00357                 {
00358                         if (columnsWidths == null)
00359                                 columnsWidths = new Dictionary<int, double>();
00360                         else
00361                                 columnsWidths.Clear();
00362 
00363                         // Fill columnWidths dictionary from widths string
00364                         string[] widthsArray = widths.Split(new char[] { ';' });
00365                         int i = 0;
00366                         foreach (string columnWidth in widthsArray)
00367                         {
00368                                 //double width = 0;
00369                                 //bool success = StringToDouble(columnWidth, out width);
00370                                 double widthInPercent = 0;
00371                                 double widthInReportUnits = 0;
00372                                 bool success = StringToDouble(columnWidth, out widthInPercent);
00373                                 widthInReportUnits = 
00374                                         (groupColumns.Count == 0 ? reportWidth : reportWidth - firstColumnWidth) 
00375                                         * widthInPercent / 100;
00376                                 if (success && !groupColumns.ContainsKey(i))
00377                                         //columnsWidths.Add(i, width);
00378                                         columnsWidths.Add(i, widthInReportUnits);
00379                                 else
00380                                         columnsWidths.Add(i, 0);
00381                                 i++;
00382                         }
00383 
00384                         // Add items to dictionary for omited columns
00385                         if (dataSet.Tables[0].Columns.Count > columnsWidths.Count)
00386                         { 
00387                                 for (int n = columnsWidths.Count; n < dataSet.Tables[0].Columns.Count; n++)
00388                                         columnsWidths.Add(n, 0);
00389                         }
00390 
00391                         // Calculate missed columns width
00392                         double predefinedColumsWidth = 0;
00393                         int notPredefinedColumnsNumber = 0;
00394                         foreach (KeyValuePair<int, double> kvp in columnsWidths)
00395                         {
00396                                 predefinedColumsWidth += kvp.Value;
00397                                 if (kvp.Value == 0 && !groupColumns.ContainsKey(kvp.Key))
00398                                         notPredefinedColumnsNumber++;
00399                         }
00400 
00401                         if (predefinedColumsWidth < reportWidth)
00402                         { 
00403                                 double missedColumnWidth = 
00404                                         (reportWidth - predefinedColumsWidth - ((groupColumns.Count != 0) ? firstColumnWidth : 0)) / notPredefinedColumnsNumber;
00405 
00406                                 for (int n = 0; n < columnsWidths.Count; n++ )
00407                                 {
00408                                         if (columnsWidths[n] == 0 && !groupColumns.ContainsKey(n))
00409                                                 columnsWidths[n] = missedColumnWidth;
00410                                 }
00411                         }
00412                         else
00413                         {
00414                                 double columnWidth =
00415                                         (reportWidth - ((groupColumns.Count != 0) ? firstColumnWidth : 0)) / (dataSet.Tables[0].Columns.Count - groupColumns.Count);
00416 
00417                                 for (int n = 0; n < columnsWidths.Count; n++)
00418                                 {
00419                                         columnsWidths[n] = columnWidth;
00420                                 }
00421                         }
00422                 }
00423 
00424                 static void SetPageSettings()
00425                 {
00426                         string interactiveHeightNodePath = "//rdlc:InteractiveHeight";
00427                         XmlNode interactiveHeightNode = root.SelectSingleNode(interactiveHeightNodePath, namespaceManager);
00428                         if (interactiveHeightNode != null)
00429                                 interactiveHeightNode.InnerText = ReportSize(interactiveHeight);
00430 
00431                         string pageHeightNodePath = "//rdlc:PageHeight";
00432                         XmlNode pageHeightNode = root.SelectSingleNode(pageHeightNodePath, namespaceManager);
00433                         if (pageHeightNode != null)
00434                                 pageHeightNode.InnerText = ReportSize(pageHeight);
00435 
00436                         string interactiveWidthNodePath = "//rdlc:InteractiveWidth";
00437                         XmlNode interactiveWidthNode = root.SelectSingleNode(interactiveWidthNodePath, namespaceManager);
00438                         if (interactiveWidthNode != null)
00439                                 interactiveWidthNode.InnerText = ReportSize(pageWidth);
00440 
00441                         string pageWidthNodePath = "//rdlc:PageWidth";
00442                         XmlNode pageWidthNode = root.SelectSingleNode(pageWidthNodePath, namespaceManager);
00443                         if (pageWidthNode != null)
00444                                 pageWidthNode.InnerText = ReportSize(pageWidth);
00445 
00446                         string widthNodePath = "//rdlc:Width";
00447                         XmlNode widthNode = root.SelectSingleNode(widthNodePath, namespaceManager);
00448                         if (widthNode != null)
00449                                 widthNode.InnerText = ReportSize(reportWidth);
00450 
00451                 }
00452 
00453         static void SetDateRange()
00454         {
00455             if (dateRange == null) return;
00456             string textBoxNodeString =
00457             "<Textbox Name=\"DateRange\">" +
00458             "    <Top>3.25cm</Top>" +
00459             "    <Width>19cm</Width>" +
00460             "    <Style>" +
00461             "       <Color>White</Color>" +
00462             "       <BackgroundColor>LightGrey</BackgroundColor>" +
00463             "       <FontFamily>Times New Roman</FontFamily> " +
00464             "       <PaddingLeft>2pt</PaddingLeft>" +
00465             "       <PaddingRight>2pt</PaddingRight>" +
00466             "       <PaddingTop>2pt</PaddingTop>" +
00467             "       <PaddingBottom>2pt</PaddingBottom>" +
00468             "       <TextAlign>Left</TextAlign>" +
00469             "    </Style>" +
00470             "    <ZIndex>1</ZIndex>" +
00471             "    <CanGrow>true</CanGrow>" +
00472             "    <Left>0.25cm</Left>" +
00473             "    <Value>Text</Value>" +
00474             "    <Height>0.5cm</Height>" +
00475             "</Textbox>";
00476 
00477             string reportNameNodePath = "//rdlc:PageHeader/rdlc:ReportItems";
00478             XmlNode reportItemsNode = root.SelectSingleNode(reportNameNodePath, namespaceManager);
00479             reportItemsNode.InnerXml = reportItemsNode.InnerXml + textBoxNodeString;
00480             string valuePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Textbox[@Name='DateRange']/rdlc:Value";
00481             root.SelectSingleNode(valuePath, namespaceManager).InnerText = dateRange;
00482         }
00483 
00484         static void SetDateRange(DynamicMaskData dynamicMaskData)
00485         {
00486             dateRange = null;
00487             foreach (DynamicMaskFilterData filter in dynamicMaskData.FiltersData.Values)
00488                 if (filter.DynamicMaskFilter.Type == DynamicMaskFilter.FilterType.DatesRage)
00489                     dateRange = string.Format("Period: {0} until {1}", filter.DateFrom.ToString("dd.MM.yyyy"), filter.DateUntil.ToString("dd.MM.yyyy"));
00490         }
00491 
00492                 static void SetPageHeaderSettings()
00493                 {
00494                         // Set Report name
00495             string reportNameNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Textbox[@Name='TXTreporttitle']/rdlc:Value";
00496                         XmlNode reportNameNode = root.SelectSingleNode(reportNameNodePath, namespaceManager);
00497                         if (reportNameNode != null)
00498                         {
00499                                 reportNameNode.InnerText = ReportingTranslation(reportName);
00500                         }
00501 
00502                         // Set path of header image
00503                         string headerImageValueNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Image/rdlc:Value";
00504                         XmlNode headerImageValueNode = root.SelectSingleNode(headerImageValueNodePath, namespaceManager);
00505                         if (headerImageValueNode != null)
00506                         {
00507                                 headerImageValueNode.InnerText = string.Format("=\"{0}\"", logoImageUrl);
00508                         }
00509 
00510                         // Set Left position of header image
00511                         string headerImageWidthNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Image/rdlc:Width";
00512                         XmlNode headerImageWidthNode = root.SelectSingleNode(headerImageWidthNodePath, namespaceManager);
00513                         string headerImageLeftNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Image/rdlc:Left";
00514                         XmlNode headerImageLeftNode = root.SelectSingleNode(headerImageLeftNodePath, namespaceManager);
00515                         if (headerImageWidthNode != null
00516                                 && headerImageLeftNode != null)
00517                         {
00518                                 double imageWidth = 0;
00519                                 bool success = ReportUnitToDouble(headerImageWidthNode.InnerText, out imageWidth);
00520                                 if (success)
00521                                 {
00522                                         double left = (reportWidth - imageWidth) / 2;
00523                                         headerImageLeftNode.InnerText = ReportSize(left);
00524                                 }
00525                         }
00526             SetDateRange();
00527                 }
00528 
00529                 static void AddDataSourcesNode()
00530                 {
00531                         string dataSourcesNodePath = "//rdlc:DataSources";
00532                         XmlNode dataSourcesNode = root.SelectSingleNode(dataSourcesNodePath, namespaceManager);
00533                         if (dataSourcesNode != null)
00534                         {
00535                                 root.RemoveChild(dataSourcesNode);
00536                         }
00537                         XmlElement dataSourcesElement = root.OwnerDocument.CreateElement("DataSources", rdlcNamespaceURI);
00538                         root.AppendChild(dataSourcesElement);
00539 
00540                         XmlElement dataSourceElement = root.OwnerDocument.CreateElement("DataSource", rdlcNamespaceURI);
00541                         dataSourceElement.SetAttribute("Name", dataSourceName);
00542                         dataSourcesElement.AppendChild(dataSourceElement);
00543 
00544                         XmlElement connectionPropertiesElement = root.OwnerDocument.CreateElement("ConnectionProperties", rdlcNamespaceURI);
00545                         dataSourceElement.AppendChild(connectionPropertiesElement);
00546 
00547                         XmlElement dataProviderElement = root.OwnerDocument.CreateElement("DataProvider", rdlcNamespaceURI);
00548                         dataProviderElement.InnerText = "SQL";
00549                         connectionPropertiesElement.AppendChild(dataProviderElement);
00550 
00551                         XmlElement connectStringElement = root.OwnerDocument.CreateElement("ConnectString", rdlcNamespaceURI);
00552                         connectionPropertiesElement.AppendChild(connectStringElement);
00553                 }
00554 
00555                 static void AdddataSetsNode()
00556                 { 
00557                         string dataSetsNodePath = "//rdlc:DataSets";
00558                         XmlNode dataSetsNode = root.SelectSingleNode(dataSetsNodePath, namespaceManager);
00559                         if (dataSetsNode != null)
00560                         {
00561                                 root.RemoveChild(dataSetsNode);
00562                         }
00563                         XmlElement dataSetsElement = root.OwnerDocument.CreateElement("DataSets", rdlcNamespaceURI);
00564                         root.AppendChild(dataSetsElement);
00565 
00566                         XmlElement dataSetElement = root.OwnerDocument.CreateElement("DataSet", rdlcNamespaceURI);
00567                         dataSetElement.SetAttribute("Name", dataSetName);
00568                         dataSetsElement.AppendChild(dataSetElement);
00569 
00570                         XmlElement fieldsElement = root.OwnerDocument.CreateElement("Fields", rdlcNamespaceURI);
00571                         dataSetElement.AppendChild(fieldsElement);
00572 
00573                         for (int i = 0; i < dataSet.Tables[0].Columns.Count; i++)
00574                         {
00575                                 XmlElement fieldElement = root.OwnerDocument.CreateElement("Field", rdlcNamespaceURI);
00576                                 fieldElement.SetAttribute("Name", ReportColumnName(dataSet.Tables[0].Columns[i].ColumnName));
00577                                 fieldsElement.AppendChild(fieldElement);
00578 
00579                                 XmlElement dataFieldElement = root.OwnerDocument.CreateElement("DataField", rdlcNamespaceURI);
00580                                 dataFieldElement.InnerText = dataSet.Tables[0].Columns[i].ColumnName;
00581                                 fieldElement.AppendChild(dataFieldElement);
00582 
00583                                 XmlElement typeNameElement = root.OwnerDocument.CreateElement("TypeName", rdNamespaceURI);
00584                                 typeNameElement.InnerText = "System.String"; //dataSet.Tables[0].Columns[i].DataType.FullName; //
00585                                 fieldElement.AppendChild(typeNameElement);
00586                         }
00587 
00588                         XmlElement queryElement = root.OwnerDocument.CreateElement("Query", rdlcNamespaceURI);
00589                         dataSetElement.AppendChild(queryElement);
00590 
00591                         XmlElement dataSourceNameElement = root.OwnerDocument.CreateElement("DataSourceName", rdlcNamespaceURI);
00592                         dataSourceNameElement.InnerText = dataSourceName;
00593                         queryElement.AppendChild(dataSourceNameElement);
00594 
00595                         XmlElement commandTextElement = root.OwnerDocument.CreateElement("CommandText", rdlcNamespaceURI);
00596                         queryElement.AppendChild(commandTextElement);
00597 
00598                         XmlElement useGenericDesignerElement = root.OwnerDocument.CreateElement("UseGenericDesigner", rdNamespaceURI);
00599                         useGenericDesignerElement.InnerText = "true";
00600                         queryElement.AppendChild(useGenericDesignerElement);
00601                 }
00602 
00603                 static XmlElement CreateBodyDefinition()
00604                 {
00605                         string bodyNodePath = "//rdlc:Body";
00606                         XmlNode bodyNode = root.SelectSingleNode(bodyNodePath, namespaceManager);
00607 
00608 
00609                         // Create ReportItems element (delete existing before creation)
00610                         string reportItemsNodePath = "//rdlc:Body/rdlc:ReportItems";
00611                         XmlNode reportItemsNode = root.SelectSingleNode(reportItemsNodePath, namespaceManager);
00612                         if (reportItemsNode != null)
00613                         {
00614                                 bodyNode.RemoveChild(reportItemsNode);
00615                         }
00616                         XmlElement reportItemsElement = bodyNode.OwnerDocument.CreateElement("ReportItems", rdlcNamespaceURI);
00617                         bodyNode.AppendChild(reportItemsElement);
00618 
00619                         // Add Table element
00620                         XmlElement tableElement = bodyNode.OwnerDocument.CreateElement("Table", rdlcNamespaceURI);
00621                         tableElement.SetAttribute("Name", "table1");
00622                         reportItemsElement.AppendChild(tableElement);
00623 
00624                         XmlElement tableDataSetNameElement = bodyNode.OwnerDocument.CreateElement("DataSetName", rdlcNamespaceURI);
00625                         tableDataSetNameElement.InnerText = dataSetName;
00626                         tableElement.AppendChild(tableDataSetNameElement);
00627 
00628                         XmlElement tableTopElement = bodyNode.OwnerDocument.CreateElement("Top", rdlcNamespaceURI);
00629                         tableTopElement.InnerText = ReportSize(tableTop);
00630                         tableElement.AppendChild(tableTopElement);
00631 
00632                         XmlElement tableHeightElement = bodyNode.OwnerDocument.CreateElement("Height", rdlcNamespaceURI);
00633                         tableHeightElement.InnerText = ReportSize(tableHeight);
00634                         tableElement.AppendChild(tableHeightElement);
00635 
00636                         XmlElement tableWidthElement = bodyNode.OwnerDocument.CreateElement("Width", rdlcNamespaceURI);
00637                         tableWidthElement.InnerText = ReportSize(reportWidth);
00638                         tableElement.AppendChild(tableWidthElement);
00639 
00640                         // Add Table Columns
00641                         XmlElement tableColumnsElement = tableElement.OwnerDocument.CreateElement("TableColumns", rdlcNamespaceURI);
00642                         tableElement.AppendChild(tableColumnsElement);
00643 
00644                         if (groupColumns.Count != 0)
00645                         {
00646                                 XmlElement tableColumnElement = tableElement.OwnerDocument.CreateElement("TableColumn", rdlcNamespaceURI);
00647                                 tableColumnsElement.AppendChild(tableColumnElement);
00648                                 XmlElement tableColumnWidthElement = tableElement.OwnerDocument.CreateElement("Width", rdlcNamespaceURI);
00649                                 tableColumnWidthElement.InnerText = ReportSize(firstColumnWidth);
00650                                 tableColumnElement.AppendChild(tableColumnWidthElement);
00651                         }
00652 
00653                         for (int i = 0; i < dataSet.Tables[0].Columns.Count; i++)
00654                         {
00655                                 if (!groupColumns.ContainsKey(i))
00656                                 {
00657                                         XmlElement tableColumnElement = tableElement.OwnerDocument.CreateElement("TableColumn", rdlcNamespaceURI);
00658                                         tableColumnsElement.AppendChild(tableColumnElement);
00659                                         XmlElement tableColumnWidthElement = tableElement.OwnerDocument.CreateElement("Width", rdlcNamespaceURI);
00660                                         tableColumnWidthElement.InnerText = ReportSize(columnsWidths[i]);
00661                                         tableColumnElement.AppendChild(tableColumnWidthElement);
00662                                 }
00663                         }
00664                         return tableElement;
00665                 }
00666 
00667                 static void AddTableGroups(XmlElement parentElement)
00668                 {
00669                         XmlElement tableGroupsElement = parentElement.OwnerDocument.CreateElement("TableGroups", rdlcNamespaceURI);
00670                         parentElement.AppendChild(tableGroupsElement);
00671 
00672                         int i = 0;
00673                         foreach (KeyValuePair<int, string> kvp in groupColumns)
00674                         {
00675                                 int columnNumber = kvp.Key;
00676                                 int groupLevel = groupColumns.Count - 1 - i;
00677                                 string fullColumnName = kvp.Value;
00678                                 string columnName = ReportColumnName(fullColumnName);
00679 
00680                                 XmlElement tableGroupElement = parentElement.OwnerDocument.CreateElement("TableGroup", rdlcNamespaceURI);
00681                                 tableGroupsElement.AppendChild(tableGroupElement);
00682 
00683                                 XmlElement groupingElement = parentElement.OwnerDocument.CreateElement("Grouping", rdlcNamespaceURI);
00684                                 groupingElement.SetAttribute("Name", "table1_group" + columnNumber.ToString());
00685                                 tableGroupElement.AppendChild(groupingElement);
00686 
00687                                 XmlElement groupExpressionsElement = parentElement.OwnerDocument.CreateElement("GroupExpressions", rdlcNamespaceURI);
00688                                 groupingElement.AppendChild(groupExpressionsElement);
00689 
00690                                 XmlElement groupExpressionElement = parentElement.OwnerDocument.CreateElement("GroupExpression", rdlcNamespaceURI);
00691                 groupExpressionElement.InnerText = string.Format("=IIf(IsNothing(Fields!{0}.Value), \"not specified\",Fields!{0}.Value)", columnName);
00692                                 groupExpressionsElement.AppendChild(groupExpressionElement);
00693 
00694                                 XmlElement sortingElement = parentElement.OwnerDocument.CreateElement("Sorting", rdlcNamespaceURI);
00695                                 tableGroupElement.AppendChild(sortingElement);
00696 
00697                                 XmlElement sortByElement = parentElement.OwnerDocument.CreateElement("SortBy", rdlcNamespaceURI);
00698                                 sortingElement.AppendChild(sortByElement);
00699 
00700                                 XmlElement sortExpressionElement = parentElement.OwnerDocument.CreateElement("SortExpression", rdlcNamespaceURI);
00701                 sortExpressionElement.InnerText = string.Format("=IIf(IsNothing(Fields!{0}.Value), \"not specified\",Fields!{0}.Value)", columnName);
00702                                 sortByElement.AppendChild(sortExpressionElement);
00703 
00704                                 XmlElement directionElement = parentElement.OwnerDocument.CreateElement("Direction", rdlcNamespaceURI);
00705                                 directionElement.InnerText = "Ascending";
00706                                 sortByElement.AppendChild(directionElement);
00707 
00708                                 AddReportPart(tableGroupElement, ReportPart.GroupHeader, columnNumber, groupLevel);
00709                                 //AddReportPart(tableGroupElement, ReportPart.GroupFooter, columnNumber);
00710                                 i++;
00711                         }
00712                 }
00713 
00714                 static void AddReportPart(XmlElement parentElement, ReportPart reportPart, int columnNumber, int groupLevel)
00715                 {
00716                         string reportPartElementName = string.Empty;
00717                         switch (reportPart)
00718                         {
00719                                 case ReportPart.Header:
00720                                 case ReportPart.GroupHeader:
00721                                         reportPartElementName = "Header";
00722                                         break;
00723                                 case ReportPart.Details:
00724                                         reportPartElementName = "Details";
00725                                         break;
00726                                 case ReportPart.Footer:
00727                                 case ReportPart.GroupFooter:
00728                                         reportPartElementName = "Footer";
00729                                         break;
00730                         }
00731 
00732                         XmlElement reportPartElement = parentElement.OwnerDocument.CreateElement(reportPartElementName, rdlcNamespaceURI);
00733                         parentElement.AppendChild(reportPartElement);
00734 
00735                         XmlElement tableRowsElement = reportPartElement.OwnerDocument.CreateElement("TableRows", rdlcNamespaceURI);
00736                         reportPartElement.AppendChild(tableRowsElement);
00737                         XmlElement tableRowElement = reportPartElement.OwnerDocument.CreateElement("TableRow", rdlcNamespaceURI);
00738                         tableRowsElement.AppendChild(tableRowElement);
00739                         XmlElement tableCellsElement = reportPartElement.OwnerDocument.CreateElement("TableCells", rdlcNamespaceURI);
00740                         tableRowElement.AppendChild(tableCellsElement);
00741 
00742                         if (reportPart == ReportPart.GroupHeader
00743                                 || reportPart == ReportPart.GroupFooter)
00744                         {
00745                                 AddTableCell(tableCellsElement, groupColumns[columnNumber], reportPart, groupLevel);
00746                         }
00747                         else
00748                         {
00749                                 if (groupColumns.Count != 0)
00750                                         AddTableCell(tableCellsElement, string.Empty, reportPart, groupLevel);
00751 
00752                 int from = _isRTL ? dataSet.Tables[0].Columns.Count - 1 : 0;
00753                 int to = _isRTL ? -1 : dataSet.Tables[0].Columns.Count;
00754                 int increment = _isRTL ? -1 : 1;
00755 
00756                 for (int i = from; i != to; i+=increment)
00757                                 {
00758                                         if (!groupColumns.ContainsKey(i))
00759                                         {
00760                                                 string columnName = dataSet.Tables[0].Columns[i].ColumnName;
00761                                                 AddTableCell(tableCellsElement, columnName, reportPart, groupLevel);
00762                                         }
00763                                 }
00764                         }
00765                         XmlElement tableRowHeightElement = reportPartElement.OwnerDocument.CreateElement("Height", rdlcNamespaceURI);
00766                         tableRowHeightElement.InnerText = ReportSize(rowHeight);
00767                         tableRowElement.AppendChild(tableRowHeightElement);
00768                 }
00769 
00770                 static void AddTableCell(XmlElement cellsElement, string fullColumnName, ReportPart reportPart, int groupLevel)
00771                 {
00772                         string columnName = ReportColumnName(fullColumnName);
00773 
00774                         XmlDocumentFragment cellFragment = cellsElement.OwnerDocument.CreateDocumentFragment();
00775                         cellFragment.InnerXml = cellXml;
00776                         XmlNode newNode = cellFragment.SelectSingleNode("//rdlc:TableCell", namespaceManager);
00777 
00778                         if (reportPart == ReportPart.GroupHeader
00779                                 || reportPart == ReportPart.GroupFooter)
00780                         {
00781                                 XmlElement colspanElement = newNode.OwnerDocument.CreateElement("ColSpan", rdlcNamespaceURI);
00782                                 colspanElement.InnerXml = (dataSet.Tables[0].Columns.Count - groupColumns.Count + 1).ToString();
00783                                 newNode.AppendChild(colspanElement);
00784                         }
00785 
00786                         XmlNode textbox = newNode.SelectSingleNode("//rdlc:Textbox", namespaceManager);
00787                         textbox.Attributes["Name"].Value = columnName + reportPart.ToString();
00788 
00789             AddDirrectionNode(textbox);
00790 
00791                         XmlNode defaultName = newNode.SelectSingleNode("//rdlc:Textbox/rd:DefaultName", namespaceManager);
00792                         defaultName.InnerText = columnName + reportPart.ToString();
00793 
00794                         XmlNode styleElement = newNode.SelectSingleNode("//rdlc:Textbox/rdlc:Style", namespaceManager);
00795                         if (reportPart == ReportPart.Header)
00796                         {
00797                                 XmlElement borderStyleElement = cellsElement.OwnerDocument.CreateElement("BorderStyle", rdlcNamespaceURI);
00798                                 styleElement.AppendChild(borderStyleElement);
00799 
00800                                 XmlElement bottomElement = cellsElement.OwnerDocument.CreateElement("Bottom", rdlcNamespaceURI);
00801                                 bottomElement.InnerText = "Solid";
00802                                 borderStyleElement.AppendChild(bottomElement);
00803                         }
00804                         
00805                         if (reportPart == ReportPart.GroupHeader)
00806                         {
00807                                 if (groupLevel == 0 || groupLevel == 3)
00808                                 {
00809                                         XmlElement colorElement = cellsElement.OwnerDocument.CreateElement("Color", rdlcNamespaceURI);
00810                                         colorElement.InnerText = "MediumBlue";
00811                                         styleElement.AppendChild(colorElement);
00812                                 }
00813 
00814                                 XmlElement fontFamilyElement = cellsElement.OwnerDocument.CreateElement("FontFamily", rdlcNamespaceURI);
00815                                 fontFamilyElement.InnerText = groupsFontFamily;
00816                                 styleElement.AppendChild(fontFamilyElement);
00817 
00818                                 XmlElement fontSizeElement = cellsElement.OwnerDocument.CreateElement("FontSize", rdlcNamespaceURI);
00819                                 int fontSize = groupFontSize + groupLevel;
00820                                 fontSizeElement.InnerText = fontSize.ToString() + fontSizeUnit;
00821                                 styleElement.AppendChild(fontSizeElement);
00822 
00823                                 if (groupLevel == 1 || groupLevel == 2)
00824                                 {
00825                                         XmlElement fontWeightElement = cellsElement.OwnerDocument.CreateElement("FontWeight", rdlcNamespaceURI);
00826                                         fontWeightElement.InnerText = "Bold";
00827                                         styleElement.AppendChild(fontWeightElement);
00828                                 }
00829 
00830                                 if (groupLevel == 0)
00831                                 {
00832                                         XmlElement fontStyleElement = cellsElement.OwnerDocument.CreateElement("FontStyle", rdlcNamespaceURI);
00833                                         fontStyleElement.InnerText = "Italic";
00834                                         styleElement.AppendChild(fontStyleElement);
00835                                 }
00836 
00837                                 if (groupLevel == 1)
00838                                 {
00839                                         XmlElement textDecorationElement = cellsElement.OwnerDocument.CreateElement("TextDecoration", rdlcNamespaceURI);
00840                                         textDecorationElement.InnerText = "Underline";
00841                                         styleElement.AppendChild(textDecorationElement);
00842                                 }
00843                         }
00844 
00845                         if (reportPart == ReportPart.Details
00846                                 || reportPart == ReportPart.Header)
00847                         {
00848                                 XmlElement fontFamilyElement = cellsElement.OwnerDocument.CreateElement("FontFamily", rdlcNamespaceURI);
00849                                 fontFamilyElement.InnerText = bodyFontFamily;
00850                                 styleElement.AppendChild(fontFamilyElement);
00851 
00852                                 XmlElement fontSizeElement = cellsElement.OwnerDocument.CreateElement("FontSize", rdlcNamespaceURI);
00853                                 fontSizeElement.InnerText = bodyFontSize;
00854                                 styleElement.AppendChild(fontSizeElement);
00855 
00856                 XmlElement AlignmentElement = cellsElement.OwnerDocument.CreateElement("TextAlign", rdlcNamespaceURI);
00857                 if (_isRTL)
00858                     AlignmentElement.InnerText = "Right";
00859                 else
00860                     AlignmentElement.InnerText = "Left";
00861                 styleElement.AppendChild(AlignmentElement);
00862                         }
00863 
00864                         XmlNode value = newNode.SelectSingleNode("//rdlc:Textbox/rdlc:Value", namespaceManager);
00865                         switch (reportPart)
00866                         {
00867                                 case ReportPart.Header:
00868                                         value.InnerText = ReportingTranslation(fullColumnName);
00869                                         break;
00870                                 case ReportPart.Details:
00871                                 case ReportPart.GroupHeader:
00872                                         if (!string.IsNullOrEmpty(fullColumnName))
00873                         value.InnerText = string.Format("=IIf(IsNothing(Fields!{0}.Value), \"not specified\",Fields!{0}.Value)", columnName);   
00874                                         break;
00875                         }
00876                         cellsElement.AppendChild(cellFragment);
00877                 }
00878 
00879                 static void SetPageFooterControlsSettings()
00880                 {
00881                         string footerLineWidthNodePath = "//rdlc:PageFooter/rdlc:ReportItems/rdlc:Line/rdlc:Width";
00882                         XmlNode footerLineWidthNode = root.SelectSingleNode(footerLineWidthNodePath, namespaceManager);
00883                         if (footerLineWidthNode != null)
00884                                 footerLineWidthNode.InnerText = ReportSize(reportWidth);
00885 
00886                         string footerTextboxNodePath = "//rdlc:PageFooter/rdlc:ReportItems/rdlc:Textbox";
00887                         XmlNodeList footerTextboxes = root.SelectNodes(footerTextboxNodePath, namespaceManager);
00888                         foreach (XmlNode footerTextboxNode in footerTextboxes)
00889                         {
00890                 AddDirrectionNode(footerTextboxNode);
00891                                 if (footerTextboxNode.Attributes["Name"].Value == "TXTadditionalFooterText")
00892                                 {
00893                                         if (string.IsNullOrEmpty(additionalFooterText))
00894                                         {
00895                                                 string footerReportItemsNodePath = "//rdlc:PageFooter/rdlc:ReportItems";
00896                                                 XmlNode footerReportItemsNode = root.SelectSingleNode(footerReportItemsNodePath, namespaceManager);
00897                                                 if (footerReportItemsNode != null)
00898                                                         footerReportItemsNode.RemoveChild(footerTextboxNode);
00899                                         }
00900                                         else
00901                                         {
00902                                                 foreach (XmlNode footerValueNode in footerTextboxNode.ChildNodes)
00903                                                 {
00904                                                         if (footerValueNode.Name == "Value")
00905                                                                 footerValueNode.InnerText = string.Format(
00906                                                                         "= \"{0}\""
00907                                                                         , additionalFooterText);
00908                                                 }
00909                                         }
00910                                 }
00911 
00912                                 if (footerTextboxNode.Attributes["Name"].Value == "TXTprintdate")
00913                                 {
00914                                         foreach (XmlNode footerValueNode in footerTextboxNode.ChildNodes)
00915                                         {
00916                                                 if (footerValueNode.Name == "Value")
00917                                                         footerValueNode.InnerText = string.Format(
00918                                                                 "= \"{0}: \" + CStr(CDate(CStr(Now()))) + \", {1}: {2}\""
00919                                                                 , ReportingTranslation("Print Date")
00920                                                                 , ReportingTranslation("User")
00921                                                                 , currentUser.Name);
00922 
00923                                                 if (footerValueNode.Name == "Top"
00924                                                         && string.IsNullOrEmpty(additionalFooterText))
00925                                                         footerValueNode.InnerText = "0.25cm";
00926                                         }
00927                                 }
00928 
00929                                 if (footerTextboxNode.Attributes["Name"].Value == "TXTpage")
00930                                 {
00931                                         int leftNodeIndex = 0;
00932                                         int i = 0;
00933                                         double left = 0;
00934                                         foreach (XmlNode footerValueNode in footerTextboxNode.ChildNodes)
00935                                         {
00936                                                 if (footerValueNode.Name == "Value")
00937                                                         footerValueNode.InnerText = "= \"" + string.Format(
00938                                                                 ReportingTranslation("Page {0} of {1}")
00939                                                                 , "\" + CStr(Globals!PageNumber) + \""
00940                                                                 , "\" + CStr(Globals!TotalPages)");
00941 
00942                                                 if (footerValueNode.Name == "Width")
00943                                                 {
00944                                                         double textboxWidth = 0;
00945                                                         bool success = ReportUnitToDouble(footerValueNode.InnerText, out textboxWidth);
00946                                                         if (success)
00947                                                         {
00948                                                                 left = reportWidth - textboxWidth;
00949                                                         }
00950                                                 }
00951 
00952                                                 if (footerValueNode.Name == "Left")
00953                                                         leftNodeIndex = i;
00954 
00955 
00956                                                 if (footerValueNode.Name == "Top"
00957                                                         && string.IsNullOrEmpty(additionalFooterText))
00958                                                         footerValueNode.InnerText = "0.25cm";
00959 
00960                                                 i++;
00961                                         }
00962 
00963                                         if (left != 0)
00964                                                 footerTextboxNode.ChildNodes[leftNodeIndex].InnerText = ReportSize(left);
00965                                 }
00966                         }
00967                 }
00968                 #endregion Private methods
00969                 //*********************************************************************
00970                 #region Utils functions
00971 
00972         static void ReversTextBoxs(XmlDocument doc,XmlNamespaceManager namespaceManager)
00973         {
00974             CultureInfo ci = new CultureInfo("en-US");
00975             NumberFormatInfo numberFormatInfo = ci.NumberFormat;
00976             XmlNodeList list = doc.SelectNodes("//rdlc:Textbox", namespaceManager);
00977             XmlNode interactiveWidthNode = doc.SelectSingleNode("//rdlc:InteractiveWidth", namespaceManager);
00978             float interactiveWidth = GetSize(interactiveWidthNode.InnerText, numberFormatInfo);
00979             foreach (XmlNode textBox in list)
00980             {
00981                 float width = GetSize(textBox.SelectSingleNode("rdlc:Width", namespaceManager).InnerText, numberFormatInfo);
00982                 XmlNode leftNode = textBox.SelectSingleNode("rdlc:Left", namespaceManager);
00983                 if (leftNode == null)
00984                     continue;
00985                 float left = GetSize(leftNode.InnerText, numberFormatInfo);
00986 
00987                 left = interactiveWidth - left - width;
00988 
00989                 left = left > 0 ? left : 0;
00990 
00991                 leftNode.InnerText = left.ToString(numberFormatInfo) + "cm";
00992             }
00993         }
00994 
00995         static float GetSize(string sizeCm, NumberFormatInfo numberFormatInfo)
00996         {
00997             float size;
00998             size = float.Parse(sizeCm.Substring(0, sizeCm.Length - 2), numberFormatInfo);
00999             return size;
01000         }
01001 
01002         static private void AddDirrectionNode(XmlNode node)
01003         {
01004             XmlNode directionNode = root.OwnerDocument.CreateElement("rdlc:Direction", rdlcNamespaceURI);
01005             directionNode.InnerText = _isRTL ? "RTL" : "LTR";
01006             XmlNode styleNode = node.SelectSingleNode("rdlc:Style", namespaceManager);
01007             if (styleNode == null)
01008             {
01009                 styleNode = root.OwnerDocument.CreateElement("rdlc:Style", rdlcNamespaceURI);
01010                 node.AppendChild(styleNode);
01011             }
01012             styleNode.AppendChild(directionNode);
01013         }
01014 
01015                 static bool StringToDouble(string stringToParse, out double number)
01016                 {
01017                         string separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
01018 
01019                         stringToParse = stringToParse.Replace(sizeUnitDecmalSeparator, separator);
01020 
01021                         return double.TryParse(stringToParse, out number);
01022                 }
01023 
01024                 static string ReportSize(double size)
01025                 {
01026                         string separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
01027                         return size.ToString().Replace(separator, sizeUnitDecmalSeparator) + sizeUnit;
01028                 }
01029 
01030                 static bool ReportUnitToDouble(string reportUnit, out double size)
01031                 {
01032                         string separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
01033 
01034                         reportUnit = reportUnit.Replace(sizeUnit, string.Empty);
01035                         reportUnit = reportUnit.Replace(sizeUnitDecmalSeparator, separator);
01036 
01037                         return double.TryParse(reportUnit, out size);
01038                 }
01039 
01040                 static string ReportColumnName(string fullColumnName)
01041                 {
01042             return fullColumnName.Replace(" ", string.Empty).Replace("-", string.Empty).Replace("(", string.Empty).Replace(")", string.Empty);
01043                 }
01044 
01045                 static string ReportingTranslation(string text)
01046                 {
01047                         return RAIS.ApplicationLogicLayer.Localisation.Translate(text
01048                                 , RAIS.Common.Messages.REPORTING_CONTEXT
01049                                 , RAIS.Common.Constants.DEFAULT_LANGUAGE
01050                                 , currentUser.Language);
01051                 }
01052 
01053                 static void TranslateTextBoxes(XmlNode node)
01054                 {
01055                         XmlNodeList nodes = node.SelectNodes("*", namespaceManager);
01056                         foreach (XmlNode childNode in nodes)
01057                         {
01058                                 if (childNode.Name == "Textbox")
01059                                 {
01060                                         XmlNode textBoxValueNode = childNode.SelectSingleNode("rdlc:Value", namespaceManager);
01061                                         if (textBoxValueNode != null && textBoxValueNode.InnerText.Length != 0)
01062                                         {
01063                         AddDirrectionNode(childNode);
01064                                                 if (textBoxValueNode.InnerText.Substring(0, 1) != "=")
01065                                                 {
01066                                                         textBoxValueNode.InnerText =
01067                                                                 ReportingTranslation(textBoxValueNode.InnerText);
01068                                                 }
01069                                         }
01070                                 }
01071                                 else
01072                                 {
01073                                         TranslateTextBoxes(childNode);
01074                                 }
01075                         }
01076                 }
01077                 #endregion Utils functions
01078         }
01079 }